package study.junit;

import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;

/**
 * BeforeClass, AfterClass 어노테이션이 붙은 메소드는 
 * 현재 테스트 클래스가 실행 되기 전과 후에 각각 한 번만 실행된다.
 * 보통 데이터를 셋하거나 테스트 후 데이터를 원복하는데 많이 쓰인다.
 * 또한 이들 어노테이션이 붙은 메소드는 'static'해야 하는데, 
 * 그 이유는 다른 테스트와 통합하여 종합적으로 테스트 할 때,
 * 다른 클래스에서 현 테스트 클래스의 초기 및 실행 후 상태를 제어하기
 * 위해 사용된다.
 * Before, After 어노테이션이 붙은 메소드는 각 테스트 메소드가 실행 될 때마다
 * 전, 후로 실행된다.
 * @author G.N.Jeong
 */
public class Example1 {

	private People people;

	@BeforeClass
	public static void classSetUp(){
		System.out.println("===== #Test Class Start# ======");
	}
	
	@AfterClass
	public static void classTearDown(){
		System.out.println("====== #Test Class End# ======");
	}
	
	@Before
	public void setUp() {
		System.out.println("====== Test 준비 시작 ======");
		people = new People();
		people.setId(1);
		people.setName("G.N.Jeong");
		people.setAge(29);
	}

	@After
	public void tearDown() {
		System.out.println("====== Test 준비 끝 ======");
	}

	@Test
	public void test1() {
		System.out.println("test1 테스트");
		printPeople();
	}

	@Test
	public void test2() {
		System.out.println("test2 테스트");
		people.setName("Y.Y.Kim");
		printPeople();
	}

	@Ignore("이 테스트는 실행 되지 않음")
	@Test
	public void test3() {
		System.out.println("test3 테스트");
		people.setName("K.M.Yhun");
		printPeople();
	}

	public void printPeople() {
		System.out.println(people);
	}

}
